package 多线程2;
//之前内容的简单复习

/**
 * 计算机的构成
 * 操作系统的基本概念
 *
 * 多进程
 * 进程管理
 * 进程调度:抢占式执行 进程调度/线程调度 方案不仅仅是抢占式执行,但抢占式是主流的方案
 *
 * 并发:单个CPU已经达到极限了
 *     多核CPU代替单核
 *     需要在代码执行任务的时候,把任务进行拆分,又多分CPU来并发式的执行
 *  多进程和多线程都是事先并发编程的方案
 *  java中以多线程为主,很少涉及多进程相关的东西(主要因为Java的API里提供的多进程编程的API比较有限,
 *  但是多线程编程的API比较丰富)
 *
 *  进程和线程的区别:(经典面试题)
 *  1.直观理解:进程包含线程 类比:进程是工厂,线程是生产线
 *  2.系统角度:进程是资源分配的基本单位.线程是CPU调度执行的基本单位
 *  3.进程和进程之间具有独立性.(每个进程都有自己的虚拟地址空间,以及有自己的文件描述符表...
 *  这些资源同一个进程的多个线程之间,共享了同一份虚拟地址空间+文件描述符表)
 */

/**
 * 关于多线程:
 * Thread类
 * 线程的创建
 * 线程的中断:核心就是让线程的入口函数执行完毕(中断是指内核中的线程结束了,而不一定是Thread对象销毁)
 * 线程的等待:join等待另一个线程先结束
 * 线程的休眠:sleep
 * 获取线程实例:Thread.currentThread();
 * 线程的状态:NEW TERMINATED RUNNABLE WAITING TIMED_WATING BLOCKED
 *
 * 线程安全:如果线程修改同一份变量,此时就可能导致修改的结果不符合预期
 * 原因:
 * 1.抢占式执行
 * 2.多个线程同时修改同一个变量
 * 解决:synchronized加锁,能够修饰一个方法/代码块
 * 进入代码块,就加锁,出了代码块就解锁
 *
 * synchronized 需要指定一个具体的加锁对象
 * 如果是修饰一个非静态方法,加锁对象就是this
 * 如果是修饰一个静态方法,加锁对象就是当前类的对象
 * 如果是修饰一个代码块,加锁对象通过()来指定
 *
 * 两个线程竞争同一把锁,才可能出现阻塞.
 * 当线程1获取到锁之后,线程2也尝试获取锁,就可能出现阻塞等待的情况
 * 直到线程1释放了锁,线程2才有可讷讷个获取到锁
 *
 * synchronized还能包含智能内存可见性.
 * 在synchronized内部如果要访问变量,就会保证一定能操作内存.(禁止了优化)
 *
 * volatile能保证内存可见性,但是不保证原子性
 *
 *
 */
public class TestDemo1 {
}
